Germán Samartino
Primer cuatrimestre 2022
Como práctica para la presentación de un trabajo que hayamos realizado, vamos a trabajar con un nuevo juego de datos que podemos descargar desde https://data.buenosaires.gob.ar/dataset/bicicletas-publicas . Este set de datos contiene informacion asociada a los viajes en las ecobicis de la Ciudad Autonoma de Buenos Aires durante el 2021. Retomando lo que vimos en el taller anterior, vamos a intentar construir visualizaciones que nos permitan ver varias cosas sobre la estacion que mas demanda de bicicletas tenga:
1. ¿Hacia dónde se dirige la gente desde esa
estación?2. ¿Cómo evolucionó el uso durante el año?3. ¿Qué día de la semana se usa más?4. ¿A qué hora crece la demanda?Primero cargaremos los paquetes que vamos a utilizar
library(tidyverse) # Set de herramientas inicial
library(lubridate) # Manejo de Fechas
library(viridis) # Escala de colores en nuestras visualizaciones
library(plotly) # Interacción a nuestras visualizaciones
library(kableExtra) # Visualizaciones de tablas
Luego cargamos la bases que vamos a utilizar. Recordemos que podemos obtener la ubicación del archivo a partir de la función file.choose(). Y luego pegar el resultado de esa función en read_csv().
bicis_21 <- read_csv("recorridos_realizados_2021.csv")
También podríamos usar directamente la ubicación desde internet. Para esto último lo que debemos hacer es, en lugar de dar click al botón Descargar como siempre, le damos click derecho y seleccionamos “Copiar la dirección del enlace”. Aca hay que prestar atención a que la dirección que nos trae termine en ‘.csv’. Recordemos que esto nos garantiza estar utilizando siempre la última versión de los datos, pero con la necesidad de estar conectades a internet y de esperar cada vez que corro mis datos a que se descarguen los datos (que podrían ser pesados).
Ahora solo debemos pegar esa ubicación en nuestro read_csv() (recuerden, la ruta del archivo va siempre entre comillas)
| id_recorrido | Duracion Recorrido | fecha_origen_recorrido | id_estacion_origen | nombre_estacion_origen | direccion_estacion_origen | long_estacion_origen | lat_estacion_origen | fecha_destino_recorrido | id_estacion_destino | nombre_estacion_destino | direccion_estacion_destino | long_estacion_destino | lat_estacion_destino | id_usuario | modelo_bicicleta |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 10758473BAEcobici | 591 | 2021-04-10 20:38:24 UTC | 2BAEcobici | 002 - Retiro I | Ramos Mejia, Jose Maria, Dr. Av. & Del Libertador Av. | -58.37472 | -34.59242 | 2021-04-10 20:48:15 UTC | 95BAEcobici | 095 - ESMERALDA | ESMERALDA 516 | -58.37817 | -34.60211 | 86840BAEcobici | ICONIC |
| 10757803BAEcobici | 1321 | 2021-04-10 16:34:08 UTC | 2BAEcobici | 002 - Retiro I | Ramos Mejia, Jose Maria, Dr. Av. & Del Libertador Av. | -58.37472 | -34.59242 | 2021-04-10 16:56:09 UTC | 73BAEcobici | 073 - Ruy Díaz de Guzmán | Avenida Martin Garcia y Ruy Díaz de Guzmán | -58.37182 | -34.63068 | 52860BAEcobici | ICONIC |
| 10756603BAEcobici | 380 | 2021-04-10 07:06:00 UTC | 3BAEcobici | 003 - ADUANA | Moreno & Av Paseo Colon | -58.36826 | -34.61103 | 2021-04-10 07:12:20 UTC | 150BAEcobici | 150 - RODRIGO BUENO | Av. España 2200 | -58.35547 | -34.61875 | 375594BAEcobici | ICONIC |
| 10756618BAEcobici | 1436 | 2021-04-10 07:25:08 UTC | 4BAEcobici | 004 - Plaza Roma | Lavalle & Bouchard | -58.36878 | -34.60182 | 2021-04-10 07:49:04 UTC | 353BAEcobici | 237 - Madero Office | 367 Sanchez De Thompson, Mariquita | -58.36469 | -34.59904 | 489972BAEcobici | ICONIC |
| 10757830BAEcobici | 3736 | 2021-04-10 16:45:01 UTC | 4BAEcobici | 004 - Plaza Roma | Lavalle & Bouchard | -58.36878 | -34.60182 | 2021-04-10 17:47:17 UTC | 207BAEcobici | 123 - BASUALDO Y RODO | Basualdo 1218 | -58.49263 | -34.64932 | 77965BAEcobici | ICONIC |
| 10757832BAEcobici | 3681 | 2021-04-10 16:45:11 UTC | 4BAEcobici | 004 - Plaza Roma | Lavalle & Bouchard | -58.36878 | -34.60182 | 2021-04-10 17:46:32 UTC | 207BAEcobici | 123 - BASUALDO Y RODO | Basualdo 1218 | -58.49263 | -34.64932 | 764009BAEcobici | ICONIC |
Una primera cuestión que podemos ver es que una de nuestras variables, “Duracion Recorrido”, tiene caracteres en mayúsculas, minúsculas y también tiene espacios. Esto es algo que sucede con frecuencia, y que puede traernos algunas dificultades más adelante. Para eso, podemos usar el paquete janitor, que viene a simplificar algunas cuestiones referidas a la exploración y el procesamiento de los datos. En principio vamos a utilizar la función clean_names(), para estandarizar el nombre de las columnas de manera rápida y sencilla. Esta es una muy buena práctica para antes de empezar a manipular nuestra base de datos. Aquí las demás columnas ya vienen con ese formato “limpio”, por lo que sólo vamos a observar cambios en el nombre de Duracion Recorrido.
Como para esta instancia sólo nos interesa la función clean_names() dentro de ese paquete, lo que hacemos es, en vez de descargar el paquete entero y llamarlo, escribimos el nombre del paquete, seguido de dos puntos escritos dos veces (::), y luego la función que queremos usar:
bicis_21_j <- bicis_21 %>%
janitor::clean_names()
| id_recorrido | duracion_recorrido | fecha_origen_recorrido | id_estacion_origen | nombre_estacion_origen | direccion_estacion_origen | long_estacion_origen | lat_estacion_origen | fecha_destino_recorrido | id_estacion_destino | nombre_estacion_destino | direccion_estacion_destino | long_estacion_destino | lat_estacion_destino | id_usuario | modelo_bicicleta |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 10758473BAEcobici | 591 | 2021-04-10 20:38:24 UTC | 2BAEcobici | 002 - Retiro I | Ramos Mejia, Jose Maria, Dr. Av. & Del Libertador Av. | -58.37472 | -34.59242 | 2021-04-10 20:48:15 UTC | 95BAEcobici | 095 - ESMERALDA | ESMERALDA 516 | -58.37817 | -34.60211 | 86840BAEcobici | ICONIC |
| 10757803BAEcobici | 1321 | 2021-04-10 16:34:08 UTC | 2BAEcobici | 002 - Retiro I | Ramos Mejia, Jose Maria, Dr. Av. & Del Libertador Av. | -58.37472 | -34.59242 | 2021-04-10 16:56:09 UTC | 73BAEcobici | 073 - Ruy Díaz de Guzmán | Avenida Martin Garcia y Ruy Díaz de Guzmán | -58.37182 | -34.63068 | 52860BAEcobici | ICONIC |
| 10756603BAEcobici | 380 | 2021-04-10 07:06:00 UTC | 3BAEcobici | 003 - ADUANA | Moreno & Av Paseo Colon | -58.36826 | -34.61103 | 2021-04-10 07:12:20 UTC | 150BAEcobici | 150 - RODRIGO BUENO | Av. España 2200 | -58.35547 | -34.61875 | 375594BAEcobici | ICONIC |
| 10756618BAEcobici | 1436 | 2021-04-10 07:25:08 UTC | 4BAEcobici | 004 - Plaza Roma | Lavalle & Bouchard | -58.36878 | -34.60182 | 2021-04-10 07:49:04 UTC | 353BAEcobici | 237 - Madero Office | 367 Sanchez De Thompson, Mariquita | -58.36469 | -34.59904 | 489972BAEcobici | ICONIC |
| 10757830BAEcobici | 3736 | 2021-04-10 16:45:01 UTC | 4BAEcobici | 004 - Plaza Roma | Lavalle & Bouchard | -58.36878 | -34.60182 | 2021-04-10 17:47:17 UTC | 207BAEcobici | 123 - BASUALDO Y RODO | Basualdo 1218 | -58.49263 | -34.64932 | 77965BAEcobici | ICONIC |
| 10757832BAEcobici | 3681 | 2021-04-10 16:45:11 UTC | 4BAEcobici | 004 - Plaza Roma | Lavalle & Bouchard | -58.36878 | -34.60182 | 2021-04-10 17:46:32 UTC | 207BAEcobici | 123 - BASUALDO Y RODO | Basualdo 1218 | -58.49263 | -34.64932 | 764009BAEcobici | ICONIC |
Lo primero que tenemos que identificar, previo a pensar en resolver las preguntas planteadas, es cuál es la estación con mayor demanda de bicicletas. Como tenemos una variable con el nombre las estaciones, utilizaremos esa como variable categórica. Y veremos la frecuencia de cada uno de los distintos valores que podía tomar (niveles de mi variable categórica o factor).
nodo_salida_mas_importante <- bicis_21_j %>%
count(nombre_estacion_origen,
sort = T,
name = 'cantidad_salidas')%>%
top_n(10)
Usamos Kable para mostrar los primeros 10 resultados de esa frecuencia (es decir, los valores contenidos en nodo_salida_mas_importante).
kable(nodo_salida_mas_importante) %>%
kable_styling(bootstrap_options = c("striped", "hover"), font_size = 12, full_width = F, position = "left") %>%
column_spec(1, background = "orange")
| nombre_estacion_origen | cantidad_salidas |
|---|---|
| 014 - Pacifico | 36260 |
| 160 - Godoy Cruz y Libertador | 32535 |
| 029 - Parque Centenario | 30853 |
| 005 - Plaza Italia | 28644 |
| 096 - Carlos Gardel | 27579 |
| 255 - BARRANCAS DE BELGRANO | 27256 |
| 292 - PLAZA BOLIVIA | 26875 |
| 147 - Constitución | 26263 |
| 009 - Parque Las Heras | 26103 |
| 121 - YATAY | 25158 |
Excelente! Comenzaremos a trabajar sobre la estación 014 - Pacifico, que se encuentra a metros de Juan B Justo y Santa Fe.
Bueno, ahora vamos a trabajar sobre nuestros datos. Como queremos saber hacia dónde se dirige la gente que saca bicicletas en nuestra estación con mayor demanda, primero debemos filtrar los registros para quedarnos solamente con los que efectivamente salen de ahí. Luego, decidimos filtrar también para que el lugar de devolución de la bicicleta sea otra estación; esto es un criterio teórico y dependerá de lo que se quiera ver, pero para casos prácticos vamos a armar el filtro con ambas condiciones. Una vez realizado, podemos directamente usar la función count(). Esta vez queremos ver la frecuencia de la variable categórica nombre_estacion_destino. Además, le agregamos la variable name igualada a un valor en formato character (siempre entre comillas). De esta manera le estamos pidiendo a R que no ponga el nombre que suele poner por defecto cuando uso la función count().
destinos_desde_pacifico <- bicis_21_j %>%
filter(nombre_estacion_origen == '014 - Pacifico' &
nombre_estacion_destino != '014 - Pacifico') %>%
count(nombre_estacion_destino,
sort = T,
name = 'cantidad_salidas_desde_pacifico')
Veamos entonces cómo quedará nuestra visualización. Utilizaremos geom_bar() definiendo los valores a visualizar en los ejes en aes() . Pero primero nos quedaremos solo con los primeros 10 valores para que la visualización no nos quede poco interpretable, utilizando la función top_n(). Dentro de ggplot, utilizaremos la funcion reorder() para cuando le indiquemos nuestro eje x. De esta manera, ordena de manera dinámica nuestros valores del eje x a partir de otro valor. Vemos que también agregamos una capa nueva scale_fill_viridis(discrete = T) . Esto es lo que nos dará una escala de colores para nuestros datos. Debemos indicar que nuestra variable de eje horizontal es discreta, es decir, no puede tomar infinitos valores como las variables continuas. Otra capa que no habíamos visto es theme(legend.position = “none”). Esta capa hace que R no nos muestre las referencias, ya que sobran.
destinos_desde_pacifico %>%
top_n(10, cantidad_salidas_desde_pacifico) %>%
ggplot(aes(x=reorder(nombre_estacion_destino,
cantidad_salidas_desde_pacifico),
weight=cantidad_salidas_desde_pacifico))+
geom_bar(aes(fill = factor(nombre_estacion_destino))) +
scale_fill_viridis(discrete = T) +
theme_minimal() +
theme(legend.position = "none") +
coord_flip() +
labs(x = 'Estación',
y = 'Cantidad de llegadas',
title = 'Cantidad de llegadas por estación',
subtitle = 'desde Pacífico',
caption = 'Fuente de datos: https://data.buenosaires.gob.ar/')
Trabajemos sobre nuestros datos. Primero volveremos a aplicar nuestro filtro para quedarnos sólo con los viajes salidos desde Pacífico, que no la tengan como estación de destino, pero, ¿Podríamos haber generado un sub-set de datos intermedio con este filtro y no repetir código? Sería una buena práctica, dado que repetir código nos lleva a que si en algún momento encontramos algún error en nuestra lógica, deberíamos ir a modificarla cada vez que repetimos código.
bicis_21_pacífico<-bicis_21_j %>%
filter(nombre_estacion_origen == '014 - Pacifico',
nombre_estacion_destino != nombre_estacion_origen)
Bueno, volviendo a lo nuestro: si queremos ver la evolución por fecha lo primero que deberíamos hacer es dejar nuestro campo fecha en el formato correcto. Como vemos viene en un formato donde también incluye la hora: para eso, primero lo convertimos a un formato que lubridate pueda entender con la función parse_date_time() (esto se llama “parseado”) y luego le pedimos que lo pase a fecha sin horario mediante as_date() . Finalmente hacemos un count para contar la frecuencia de cada fecha.
viajes_desde_pacifico_que_fecha <- bicis_21_pacífico %>%
mutate(fecha_de_inicio = parse_date_time(fecha_origen_recorrido, 'ymd HMS'),
dia_inicio = as_date(fecha_de_inicio)) %>%
count(dia_inicio)
Veamos cómo queda entonces la visualización. Utilizaremos geom_line() definiendo los valores a visualizar en los ejes en aes() . Además vemos que en el aes propio del geom_line(), podemos definir detalles como el color y el tamaño de la línea.
visualizacion_viajes_por_fecha <- viajes_desde_pacifico_que_fecha %>%
ggplot(aes(x=dia_inicio, y = n)) +
geom_line(color = 'green3', size = .5)+
theme_minimal() +
theme(legend.position = "none") +
labs(x = 'Dia',
y = 'Cantidad de salidas',
title = 'Cantidad de salidas por día desde Pacífico')
ggplotly(visualizacion_viajes_por_fecha, tooltip = c("x", "y"))
En esta clase exploramos herramientas para presentar el trabajo que hicimos, acompañando los datos explorados con una explicación de los pasos y las decisiones tomadas. Como vimos, Rmarkdown contiene una cantidad de parámetros muy numeroso, que nos va a permitir acomodar visualmente la salida a lo que queramos mostrar.
Les dejamos dos ejercicios a modo de trabajo práctico opcional para que continúen explorando los datos y pongan en práctica los contenidos vistos hasta ahora. Les proponemos que lo resuelvan realizándolo en un archivo .rmd!
Para saber qué día de la semana se usa más la ecobici en la estación con mayor demanda, lo primero que haremos será cambiar el formato de la fecha para saber qué día de la semana corresponde a cada registro. Entonces, utilizando el data set bicis_21_pacifico, agregamos una nueva variable en formato lubridate a la cual le asignamos la fecha de origen. Con la función wday() sabemos a qué dia de la semana corresponde cada registro. Por ultimo, contamos los registros anuales para cada día de la semana, pudiendo manipularla como variable categórica al settear label = True
dia_con_mas_demanda <- bicis_21_pacífico %>%
mutate(fecha_de_inicio = parse_date_time(fecha_origen_recorrido, 'ymd HMS'),
dia_inicio = as_date(fecha_de_inicio),
dia_de_semana = wday(dia_inicio,
label = T,
abbr = T)) %>%
count(dia_de_semana,
sort = T,
name = "cantidad_salidas_por_dia")
Ahora procedemos a la visualización de los resultados mediante un gráfico de barras geom_bar():
visualizacion_salidas_por_dia_semana <- dia_con_mas_demanda %>%
ggplot(aes(x=dia_de_semana,
y = cantidad_salidas_por_dia,
label = cantidad_salidas_por_dia,
fill = dia_de_semana)) +
geom_bar(stat='identity',
width = 0.7,
position = "nudge") +
geom_text(size = 4, # tamaño de letra,
position = position_stack(vjust = 1.05), # ubicación
colour = 'black') +
scale_fill_viridis(discrete = T) +
scale_x_discrete(label = c("Sun"="Domingo", "Mon"="Lunes", "Tue"="Martes", "Wed"="Miércoles", "Thu"="Jueves", "Fri"="Viernes", "Sat"="Sábado")) +
theme_minimal() +
theme(legend.position = "none") +
labs(x = 'Día de la semana',
y = 'Cantidad de salidas',
title = 'Cantidad de salidas por dia de semana',
subtitle = 'desde Pacífico',
caption = 'Fuente de datos: https://data.buenosaires.gob.ar/')
visualizacion_salidas_por_dia_semana
En el gráfico se observa que la cantidad de salidas desde la estación Pacífico para el año 2021 tienen su máximo en el día Martes, con un acumulado anual de 5634 salidas.
Para saber cómo crece por hora la demanda de ecobicis en la estación Pacífico en el año 2021 primero pondremos la fecha en un formato que nos permita acceder a la hora en que se realizó cada registro. Para ello, creamos una nueva variable que tenga el formato hour(). Luego contamos cuantos registros hay por cada hora del día a lo largo del año.
hora_con_mas_demanda <- bicis_21_pacífico %>%
mutate(fecha_de_inicio = parse_date_time(fecha_origen_recorrido, 'ymd HMS'),
hora_inicio = hour(fecha_de_inicio)) %>%
count(hora_inicio,
name="cantidad_de_salidas")
Obteniendo el siguiente dataset:
| hora_inicio | cantidad_de_salidas |
|---|---|
| 0 | 585 |
| 1 | 584 |
| 2 | 295 |
| 3 | 165 |
| 4 | 200 |
| 5 | 175 |
| 6 | 458 |
| 7 | 1041 |
| 8 | 1468 |
| 9 | 1467 |
| 10 | 1199 |
| 11 | 1486 |
| 12 | 1676 |
| 13 | 2146 |
| 14 | 2123 |
| 15 | 2170 |
| 16 | 2490 |
| 17 | 3050 |
| 18 | 3013 |
| 19 | 2640 |
| 20 | 2253 |
| 21 | 1405 |
| 22 | 840 |
| 23 | 685 |
Es importante aclarar que se trata de la contidad de salidas desde Pacífico acumuladas a lo largo del año 2021. En caso de quere acceder a la media diaria de salidas por hora tenemos que dividir la cantidad anual de salidas que obtuvimos para cada hora por los 365 días del año. Para visualizar estos resultados utilizamos geom_line:
visualizacion_viajes_hora <- hora_con_mas_demanda %>%
ggplot(aes(x=hora_inicio,y = cantidad_de_salidas/365)) +
geom_line(aes(x=as.factor(hora_inicio), y = cantidad_de_salidas/365),
group=1,
color = 'orange',
size = .5)+
theme_minimal() +
theme(legend.position = "none") +
labs(x = 'Hora',
y = 'Cantidad de salidas',
title = 'Cantidad de salidas diarias por hora desde Pacífico')
ggplotly(visualizacion_viajes_hora, tooltip = c("x", "y"))
El gráfico muestra que la demanda de ecobicis en la estación Pacífico comienza a crecer a partir de las 5:00 AM, llegando a su máximo a las 17:00 PM.